// Compile with
//  gcc -m32 -I src/char -I src/common charfrob.c -o charfrob  src/common/timer.o src/common/malloc.o src/common/socket.o src/common/lock.o src/common/db.o src/char/int_pet.o src/char/int_storage.o src/char/inter.o src/char/int_party.o src/char/int_guild.o

#include <stdio.h>
#include <stdlib.h>
#include "../common/mmo.h"
#include "../char/char.c"

// Well, this is not terribly elegant, but I don't have that much time.
#define MAX_MAP 1024
#define MAP_NAME_SIZE 32
int maps_nr = 0;
struct {
    char old[MAP_NAME_SIZE], new[MAP_NAME_SIZE];
} maps[MAX_MAP];

void
transform_point(struct point *p)
{
        int k;

        if (!p->map[0])
                return;

        for (k = 0; k < maps_nr; k++)
                if (!strcmp(p->map, maps[k].old)) {
                        strcpy(p->map, maps[k].new);
                        return;
                }

        fprintf(stderr, "Warning: untranslated map `%s'\n", p->map);
}

void
transform_char(struct mmo_charstatus *p)
{
        int i;

        transform_point(&p->last_point);
        transform_point(&p->save_point);

        for (i = 0; i < 10; i++)
                transform_point(&p->memo_point[i]);
}

int mmo_char_convert()
{
        char line[965536];
        int ret;
	struct mmo_charstatus char_dat;
        FILE *ifp,*ofp;

	ifp=stdin;
	ofp=stdout;
        while(fgets(line,65535,ifp)){
                memset(&char_dat,0,sizeof(struct mmo_charstatus));
                ret=mmo_char_fromstr(line,&char_dat);
                if(ret){
                        transform_char(&char_dat);
                        mmo_char_tostr(line,&char_dat);
                        fprintf(ofp,"%s" RETCODE,line);
                }
        }
        fcloseall();
        return 0;
}

#define PARSE_MODE_NEXTNUM 0
#define PARSE_MODE_RANGE 1

int init(int count, char **translates)
{
        int i;
        char *suffix = ".gat";

        for (i = 0; i < count; i++) {
                char *src = translates[i];
                char *dest = strchr(src, ':');

                if (!dest) {
                        fprintf(stderr, "Missing colon in: `%s'\n", src);
                        return 1;
                }

                *dest++ = 0;

                if (strlen(src) + strlen(suffix) >= MAP_NAME_SIZE) {
                        fprintf(stderr, "Map name prefix too long: `%s'\n", src);
                        return 1;
                }

                if (strlen(dest) + strlen(suffix) >= MAP_NAME_SIZE) {
                        fprintf(stderr, "Map name prefix too long: `%s'\n", dest);
                        return 1;
                }

                strncpy(maps[maps_nr].old, src, MAP_NAME_SIZE);
                strcat(maps[maps_nr].old, suffix);
                strncpy(maps[maps_nr].new, dest, MAP_NAME_SIZE);
                strcat(maps[maps_nr].new, suffix);

                ++maps_nr;
        }

        return 0;
}

int main(int argc,char *argv[])
{
	if(argc < 2) {
		printf("Usage: %s oldmap0:newmap0 oldmap1:newmap1 ...\n", argv[0]);
                printf("e.g., %s new_1-1:001-2 new_2-1:001-1\n", argv[0]);
                puts("The extension `.gat' is appended implicitly.");
		exit(0);
	}
        if (init(argc - 1, argv + 1))
                return 1;

	mmo_char_convert();

	return 0;
}


/* satisfy linker */
void set_termfunc(void (*termfunc)(void)) {};
